#include<iostream>
#include<string>
#include<regex>

//正则表达式



//HTTP 请求格式 GET /number/login?user=xiaomin&pass=132456 HTTP/1.1\r\n
int main(){
    //处理HTTP首行方法
    // std::string str = "GET /number/login?user=xiaomin&pass=132456 HTTP/1.1";
    // std::regex e("(GET|HEAD|POST|PUT|DELETE) .*");
    // std::smatch matches;
    // bool ret = std::regex_match(str,matches,e);
    // if(ret == false)
    //     return -1;
    // for(auto &s:matches)
    //     std::cout<<s << std::endl;
    // return 0;

    //测试使用正则表达式
    // std::string str = "/number/123456";
    // std::regex e("/number/(\\d+)");
    // std::smatch matches;
    // bool ret = std::regex_match(str,matches,e);
    // if(ret == false)
    //     return -1;
    // for(auto &s:matches)
    //     std::cout<<s << std::endl;
    // return 0;

    //请求路径
    // std::string str = "GET /number/login?user=xiaomin&pass=132456 HTTP/1.1";
    // std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*).*");
    // //[^?] 匹配非问号字符
    // std::smatch matches;
    // bool ret = std::regex_match(str,matches,e);
    // if(ret == false)
    //     return -1;
    // for(auto &s:matches)
    //     std::cout<<s << std::endl;
    // return 0;

    // //查询字符串
    // std::string str = "GET /number/login?user=xiaomin&pass=132456 HTTP/1.1";
    // std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) .*");
    // // \\?表示原始？
    // std::smatch matches;
    // bool ret = std::regex_match(str,matches,e);
    // if(ret == false)
    //     return -1;
    // for(auto &s:matches)
    //     std::cout<<s << std::endl;
    // return 0;

     //HTTP协议版本
    // std::string str = "GET /number/login?user=xiaomin&pass=132456 HTTP/1.1";
    // std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1\\.[01])");
    // std::smatch matches;
    // bool ret = std::regex_match(str,matches,e);
    // if(ret == false)
    //     return -1;
    // for(auto &s:matches)
    //     std::cout<<s << std::endl;
    // return 0;

    std::string str = "GET /number/login?user=xiaomin&pass=132456 HTTP/1.1\r\n";
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    //(?:\n|\r\n)?  (?: ...)表示匹配某个字符串但不提取 最后的问号表示的是匹配前边的表达式0次或1次
    std::smatch matches;
    bool ret = std::regex_match(str,matches,e);
    if(ret == false)
        return -1;
    for(auto &s:matches)
        std::cout<<s << std::endl;
    return 0;
}